//
//  BAHomeListViewModel.swift
//  BAweibo
//
//  Created by baggio on 2017/8/18.
//  Copyright © 2017年 baggio. All rights reserved.
//


/*
 mvc 传递的是 model，mvvm 传递的是 viewModel
 viewModel 负责请求数据，保存数据，处理数据，提供数据，跟 ui 没有关系；viewModel 请求数据成功或失败，要告知 controller（通过closure），让 controller 去刷新 view
 controller 中只应该放不可复用的代码，比如：初始化构造 view 和 model；监听 model 层的事件，并将 model 层的数据传递到 view 层；监听 view 层的事件，并将 view 层的事件转发到 model 层；
 一个 controller 可以使用多个 viewModel
 */



import UIKit
import SDWebImage

//ViewModel 不必要继承 NSObject
class BAHomeListViewModel {

    //    //保存 model 模型数组
    //    lazy var dataArray: [BAHomeModel] = [BAHomeModel]()
    //改成保存 viewModel 视图模型数组
    lazy var dataArray: [BAHomeViewModel] = [BAHomeViewModel]()
    
    //封装到  BANetworkingTools 中
    //需要加一个参数 isPullUP，判断是下拉刷新还是上拉加载更多
    //闭包中加一个参数 count，用于首页顶部提示更新了多少条微博
    func loadHomeData(isPullUP: Bool, isSucceeded: @escaping (Bool,Int) -> ()) {
        
        /*
         since_id Int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
         max_id Int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
         */
        var since_id: Int64 = 0
        var max_id: Int64 = 0
        
        //上拉加载更多
        if isPullUP {
            max_id = dataArray.last?.homeModel?.id ?? 0
            if max_id > 0 {
                max_id = max_id - 1
            }
        } else {
            //下拉刷新
            since_id = dataArray.first?.homeModel?.id ?? 0
        }
        
        BANetworkingTools.share.loadHomeData(since_id: since_id, max_id: max_id, success: { (response) in
            //print("请求首页数据成功", response)
            //转字典
            guard let resDict = response as? [String: Any] else {
                isSucceeded(false, 0)
                return
            }
            //取得 statuses 的值，再转字典数组
            guard let statusArr = resDict["statuses"] as? [[String: Any]] else {
                isSucceeded(false, 0)
                return
            }
            //利用 YYModel 把字典数组转模型数组
            guard let modelArr = NSArray.yy_modelArray(with: BAHomeModel.self, json: statusArr) as? [BAHomeModel] else {
                isSucceeded(false, 0)
                return
            }
            //默认返回20条微博
            //print(modelArr.count)
            
            
            //如果是单张图，在刷新 home ui 之前要把图下载到本地（用 SDWebImage）。最差可能有40个图要下载，要用多线程 gcd 调度组（监听各个子线程都完成后，再执行回调刷新 ui）
            //创建调度组
            let group = DispatchGroup()
            
            //self.dataArray = modelArr
            //dataArray 改成 homeViewModel 视图模型数组了

            //要做下拉刷新和上拉加载更多，只有 self.dataArray 不够用了，需要加一个临时数组
            var tmpDataArray: [BAHomeViewModel] = [BAHomeViewModel]()
            
            for model in modelArr {
                let tmpHomeViewModel = BAHomeViewModel()
                tmpHomeViewModel.homeModel = model
                tmpDataArray.append(tmpHomeViewModel)
//                self.dataArray.append(homeViewModel)
                
                //如果是单张图（原创微博）
                if model.pic_urls?.count == 1 {
                    //给调度组打一个标识
                    group.enter()
                    
                    //图片下载到本地
                    SDWebImageManager.shared().loadImage(with: URL(string: (model.pic_urls?.first?.thumbnail_pic) ?? ""), options: [], progress: nil, completed: { (_, _, _, _, _, _) in
                        //完成后，把调度组的标志去掉，和 enter()对应
                        group.leave()
                        //print("保存原创微博单张图片完成")
                    })
                }
                //如果是单张图（转发微博）
                if model.retweeted_status?.pic_urls?.count == 1 {
                    group.enter()
                    SDWebImageManager.shared().loadImage(with: URL(string: (model.retweeted_status?.pic_urls?.first?.thumbnail_pic) ?? ""), options: [], progress: nil, completed: { (_, _, _, _, _, _) in
                        group.leave()
                        //print("保存转发微博单张图片完成")
                    })
                }
            }
            
            //服务器返回数据的顺序 == 数组的顺序：越新的排在越前面
            if isPullUP {
                //上拉加载更多
                self.dataArray = self.dataArray + tmpDataArray
            } else {
                //下拉刷新
                self.dataArray = tmpDataArray + self.dataArray
            }
            
            //刷新 tableView，viewModel 中不能刷新界面，要通过 closure 告知 controller，让 controller 去刷新 view
            //尽量在加载 tableView 等待的过程中，做更多的逻辑处理；后面滚动 tableView 的时候尽量少做逻辑处理
//            isSucceeded(true)
            
            //使用调度组监听以上子线程是否完成，完成后在主线程中继续，isSucceeded(true)通知 controller 刷新 ui
            group.notify(queue: DispatchQueue.main, execute: {
                //print("保存全部单张图片完成")
                isSucceeded(true, tmpDataArray.count)
            })
            
        }) { (error) in
            print("请求首页数据失败", error)
        }
        //        let urlString="https://api.weibo.com/2/statuses/home_timeline.json"
        //        let params=[
        //            "access_token": BAOAuthViewModel.share.oAuthModel?.access_token
        //        ]
        //
        //        BANetworkingTools.share.request(type: .get, urlString: urlString, parameters: params, success: { (response) in
        //            //print("请求首页数据成功", response)
        //            //转字典
        //            guard let resDict = response as? [String: Any] else {
        //                isSucceeded(false)
        //                return
        //            }
        //            //取得 statuses 的值，再转字典数组
        //            guard let statusArr = resDict["statuses"] as? [[String: Any]] else {
        //                isSucceeded(false)
        //                return
        //            }
        //            //利用 YYModel 把字典数组转模型数组
        //            guard let modelArr = NSArray.yy_modelArray(with: BAHomeModel.self, json: statusArr) as? [BAHomeModel] else {
        //                isSucceeded(false)
        //                return
        //            }
        //            //默认返回20条微博
        //            //print(modelArr.count)
        //
        //            self.dataArray = modelArr
        //
        //            //刷新 tableView，vm 中不能刷新界面，要通过 closure 告知 c，让 c 去刷新 v
        //            isSucceeded(true)
        //            
        //        }) { (error) in
        //            print("请求首页数据失败", error)
        //            isSucceeded(false)
        //        }
    }
}
